有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javafx在java中显示图像或形状的二维网格

之前我制作了一个ASCII字符的二维网格,在这个网格中我可以移动一个ASCII字符。现在,我想通过在javafx窗口中制作一个“可视化”版本来将其提升到下一个级别。我试过制作两个图像对象,一个内部有一个黑色正方形,一个内部有一个白色正方形,然后将这两个对象多次放入二维网格中,如下所示:

  Image[][] Grid = {
  {B,W,B,B,B,B,B,B,B,B,B},
  {B,B,B,B,W,W,W,B,B,B,B},
  {B,B,B,B,B,B,B,B,B,B,B}
  };

问题是,我知道如何显示它们的唯一方法是为每个索引制作一个imageview对象,如果我说想要一个25X25网格,这意味着我必须制作625个imageview对象,这显然是荒谬的

我还尝试过简单地将网格索引逐个放入窗格,如下所示:

HBox gameLayout = new HBox(Grid[1][1], Grid[1][2], Grid[1][3]);

但这给了我一个“invocationTargetException”

我的目标是通过专门瞄准和操纵网格元素来制作snake。当我将“B”数组元素的值更改为“W”(白色)时,我希望方形颜色/图像视图/矩形/任何东西都可以更改,但我尝试的方法要么效率很低,要么就是不起作用


共 (1) 个答案

  1. # 1 楼答案

    创建多个ImageView实例的目的完全不清楚。因为它们可以引用同一个Image实例,所以这应该是相当有效的(图像数据不需要复制)

    这似乎很管用:

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.image.WritableImage;
    import javafx.scene.layout.GridPane;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    public class TiledBoard extends Application {
    
        private final int tileSize = 30 ;
    
        @Override
        public void start(Stage primaryStage) {
    
            Image b = createImage(Color.BLACK);
            Image w = createImage(Color.WHITE);
    
    
            Image[][] grid = {
                {b,w,b,b,b,b,b,b,b,b,b},
                {b,b,b,b,w,w,w,b,b,b,b},
                {b,b,b,b,b,b,b,b,b,b,b}
            };
    
            GridPane gridPane = new GridPane();
    
            // for visualizing the different squares:
            gridPane.setHgap(2);
            gridPane.setVgap(2);
            gridPane.setStyle("-fx-background-color: grey;");
    
            for (int y = 0 ; y < grid.length ; y++) {
                for (int x = 0 ; x < grid[y].length ; x++) {
                    ImageView imageView = new ImageView(grid[y][x]);
                    imageView.setFitWidth(tileSize);
                    imageView.setFitHeight(tileSize);
                    gridPane.add(imageView, x, y);
                }
            }
            Scene scene = new Scene(gridPane);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        private Image createImage(Color color) {
            WritableImage image = new WritableImage(1, 1);
            image.getPixelWriter().setColor(0, 0, color);
            return image ;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    enter image description here

    如果您愿意,您可以使用某种Shape(例如Rectangle)来实现这一点:

    @Override
    public void start(Stage primaryStage) {
    
        Color b = Color.BLACK;
        Color w = Color.WHITE;
    
    
        Color[][] grid = {
            {b,w,b,b,b,b,b,b,b,b,b},
            {b,b,b,b,w,w,w,b,b,b,b},
            {b,b,b,b,b,b,b,b,b,b,b}
        };
    
        GridPane gridPane = new GridPane();
    
        // for visualizing the different squares:
        gridPane.setHgap(2);
        gridPane.setVgap(2);
        gridPane.setStyle("-fx-background-color: grey;");
    
        for (int y = 0 ; y < grid.length ; y++) {
            for (int x = 0 ; x < grid[y].length ; x++) {
                Rectangle rect = new Rectangle(tileSize, tileSize, grid[y][x]);
                gridPane.add(rect, x, y);
            }
        }
        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    或者用Region来表示:

    @Override
    public void start(Stage primaryStage) {
    
        Color b = Color.BLACK;
        Color w = Color.WHITE;
    
    
        Color[][] grid = {
            {b,w,b,b,b,b,b,b,b,b,b},
            {b,b,b,b,w,w,w,b,b,b,b},
            {b,b,b,b,b,b,b,b,b,b,b}
        };
    
        GridPane gridPane = new GridPane();
    
        // for visualizing the different squares:
        gridPane.setHgap(2);
        gridPane.setVgap(2);
        gridPane.setStyle("-fx-background-color: grey;");
    
        for (int y = 0 ; y < grid.length ; y++) {
            for (int x = 0 ; x < grid[y].length ; x++) {
                Region rect = new Region();
                rect.setMinSize(tileSize, tileSize);
                rect.setPrefSize(tileSize, tileSize);
                rect.setMaxSize(tileSize, tileSize);
                rect.setBackground(new Background(new BackgroundFill(grid[y][x], CornerRadii.EMPTY, Insets.EMPTY)));
                gridPane.add(rect, x, y);
            }
        }
        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    哪一个更好实际上取决于你还想用它们做什么